From ab53ee737739284e2b8b6a3e5b0021d4a61f7540 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timm=20B=C3=A4der?= Date: Thu, 7 Dec 2017 17:30:02 +0100 Subject: [PATCH] gl renderer: Don't render opacity nodes offscreen We already drag a u_alpha uniform around in every shader, so use that one. --- gsk/gl/gskglrenderer.c | 30 +++--------------------------- gsk/gl/gskglrenderops.c | 11 +++++++++++ gsk/gl/gskglrenderopsprivate.h | 1 + 3 files changed, 15 insertions(+), 27 deletions(-) diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index fb98de3b08..0555da735f 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -1029,37 +1029,13 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer *self, case GSK_OPACITY_NODE: { - int texture_id; - gboolean is_offscreen; float prev_opacity; + prev_opacity = ops_set_opacity (builder, + builder->current_opacity * gsk_opacity_node_get_opacity (node)); - add_offscreen_ops (self, builder, min_x, max_x, min_y, max_y, - gsk_opacity_node_get_child (node), - &texture_id, &is_offscreen); - - /* Now draw the texture with the node's opacity */ - ops_set_program (builder, &self->blit_program); - prev_opacity = ops_set_opacity (builder, gsk_opacity_node_get_opacity (node)); - ops_set_texture (builder, texture_id); - - if (is_offscreen) - { - GskQuadVertex vertex_data[GL_N_VERTICES] = { - { { min_x, min_y }, { 0, 1 }, }, - { { min_x, max_y }, { 0, 0 }, }, - { { max_x, min_y }, { 1, 1 }, }, + gsk_gl_renderer_add_render_ops (self, gsk_opacity_node_get_child (node), builder); - { { max_x, max_y }, { 1, 0 }, }, - { { min_x, max_y }, { 0, 0 }, }, - { { max_x, min_y }, { 1, 1 }, }, - }; - ops_draw (builder, vertex_data); - } - else - { - ops_draw (builder, vertex_data); - } ops_set_opacity (builder, prev_opacity); } break; diff --git a/gsk/gl/gskglrenderops.c b/gsk/gl/gskglrenderops.c index 8e96888b72..d3fa195285 100644 --- a/gsk/gl/gskglrenderops.c +++ b/gsk/gl/gskglrenderops.c @@ -65,6 +65,14 @@ ops_set_program (RenderOpBuilder *builder, g_array_append_val (builder->render_ops, op); builder->program_state[program->index].clip = builder->current_clip; } + + if (builder->program_state[program->index].opacity != builder->current_opacity) + { + op.op = OP_CHANGE_OPACITY; + op.opacity = builder->current_opacity; + g_array_append_val (builder->render_ops, op); + builder->program_state[program->index].opacity = builder->current_opacity; + } } GskRoundedRect @@ -244,6 +252,9 @@ ops_set_opacity (RenderOpBuilder *builder, prev_opacity = builder->current_opacity; builder->current_opacity = opacity; + if (builder->current_program != NULL) + builder->program_state[builder->current_program->index].opacity = opacity; + return prev_opacity; } diff --git a/gsk/gl/gskglrenderopsprivate.h b/gsk/gl/gskglrenderopsprivate.h index 7e35373339..7a7ed397da 100644 --- a/gsk/gl/gskglrenderopsprivate.h +++ b/gsk/gl/gskglrenderopsprivate.h @@ -174,6 +174,7 @@ typedef struct graphene_matrix_t projection; int source_texture; graphene_rect_t viewport; + float opacity; /* Per-program state */ union { GdkRGBA color; -- 2.30.2